package org.jl.main;

import org.jl.main.util.UtilForCollection;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 链表
 */
public class Main03_LinkedList {

    /*
    队列
    q1:[a, b, c, d, e]
    poll:a
    q1:[b, c, d, e]
    peek:b
    q1:[b, c, d, e]
    q1 is empty:false
    q1:[]
     */
    public static void main1(String[] args) {
        Queue<String> q1 = new LinkedList<>();
        //add如果队列已满会抛异常，put如果队列已满则阻塞
        q1.offer("a");
        q1.offer("b");
        q1.offer("c");
        q1.offer("d");
        q1.offer("e");
        System.out.println("q1:" + q1);
        //取出并删除，remove如果队列为空会抛异常，take如果队列为空则阻塞
        System.out.println("poll:" + q1.poll());
        System.out.println("q1:" + q1);
        //取出不删除，element如果队列为空会抛异常
        System.out.println("peek:" + q1.peek());
        System.out.println("q1:" + q1);
        //判断是否为空
        System.out.println("q1 is empty:" + q1.isEmpty());
        //清除
        q1.clear();
        System.out.println("q1:" + q1);
    }

    /*
    栈
    d1:[e, d, c, b, a]
    pop:e
    d1:[d, c, b, a]
    peek:d
    d1:[d, c, b, a]
    d1 is empty:false
    d1:[]
     */
    public static void main2(String[] args) {
        //栈，先进后出（LIFO），替代Stack
        Deque<String> d1 = new LinkedList<>();
        //add返回布尔类型
        d1.push("a");
        d1.push("b");
        d1.push("c");
        d1.push("d");
        d1.push("e");
        System.out.println("d1:" + d1);
        //取出并删除，如果栈为空会抛异常，remove("a")取不到会返回false
        System.out.println("pop:" + d1.pop());
        System.out.println("d1:" + d1);
        //取出不删除，如果栈为空会抛异常
        System.out.println("peek:" + d1.peek());
        System.out.println("d1:" + d1);
        //判断是否为空
        System.out.println("d1 is empty:" + d1.isEmpty());
        //清除
        d1.clear();
        System.out.println("d1:" + d1);
    }

    //堆在逻辑上就是一棵完全二叉树，堆的基本作用是快速找集合中的最值

    /*
    链表
    l1:[b, c, d]
    l1:[a, b, c, d, e]
    l1:[b, c, d]
    l1:[]
     */
    public static void main3(String[] args) {
        //链表，相比ArrayList添加和删除效率更高
        LinkedList<String> l1 = new LinkedList<>();
        UtilForCollection.of(l1, "b", "c", "d");
        System.out.println("l1:" + l1);
        l1.addFirst("a");
        l1.addLast("e");
        System.out.println("l1:" + l1);
        System.out.println("remove first:" + l1.removeFirst());
        System.out.println("remove last:" + l1.removeLast());
        System.out.println("l1:" + l1);
        l1.clear();
        System.out.println("l1:" + l1 + "\n");
    }
}
